﻿// 信号量.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include <Windows.h>

/*
信号量（旗语）：semphore
		信号量是一种同步机制，用于协调多个进程或线程之间的访问和操作共享资源。信号量通常是一个整数计数器，其值表示可用资源的数量或等待资源的进程或线程数量。当一个进程或线程需要使用资源时，
		它会尝试获取信号量，如果信号量的值大于0，则该进程或线程可以继续执行，并将信号量的值减1；否则，该进程或线程必须等待，直到其他进程或线程释放资源，并将信号量的值增加1。
		当进程或线程使用完资源时，它必须释放信号量，以便其他进程或线程可以使用该资源。信号量可以用于解决诸如死锁、竞争条件和资源争用等问题
    定义信号量			HANDLE
    创建信号量			CreateSemaphore
    等待操作			WaitForSingleObject			对信号量进行操作
    设置信号量			ReleaseSemaphore

	操作系统内核 维护了一个变量   sem
		WaitForSingleObject 是去减少这个sem 减少到0就不可再减了，就阻塞
		ReleaseSemaphore	就是去增加



*/



#define ISF 0
#define ISFC 1


int n = 0;

HANDLE semphore;


#if ISF
void f()
{
	for (int i = 0; i < 50000000; i++)
	{
		WaitForSingleObject(semphore, INFINITE);
		n++;
	}
}
void f2()
{
	Sleep(5000);
	while (1)
	{
		ReleaseSemaphore(semphore,1,NULL);	
		Sleep(1000);
	}
}

#endif


#if ISFC
void fc1()
{
	while (1)
	{
		WaitForSingleObject(semphore, INFINITE);
		printf("fc1——————\n");

	}
}
void fc2()
{
	while (1)
	{
		WaitForSingleObject(semphore, INFINITE);
		printf("fc2======\n");

	}
}
void fc3()
{
	Sleep(5000);
	while (1)
	{
		ReleaseSemaphore(semphore,1,NULL);	//按指定量增加指定的信号灯对象的计数。
		Sleep(1000);
	}
}
#endif


int main()
{
	semphore = CreateSemaphore(NULL,6,666,  NULL);



	//创建线程： 
#if ISF
	HANDLE h1 = CreateThread(NULL, NULL,
		(LPTHREAD_START_ROUTINE)f,
		NULL, NULL, NULL);
	HANDLE h2 = CreateThread(NULL, NULL,
		(LPTHREAD_START_ROUTINE)f,
		NULL, NULL, NULL);
	HANDLE h3 = CreateThread(NULL, NULL,
		(LPTHREAD_START_ROUTINE)f2,
		NULL, NULL, NULL);



	WaitForSingleObject(h1, INFINITE);
	WaitForSingleObject(h2, INFINITE);
	WaitForSingleObject(h3, INFINITE);
#endif

#if ISFC
	HANDLE h1 = CreateThread(NULL, NULL,
		(LPTHREAD_START_ROUTINE)fc1,
		NULL, NULL, NULL);

	HANDLE h2 = CreateThread(NULL, NULL,
		(LPTHREAD_START_ROUTINE)fc2,
		NULL, NULL, NULL);

	HANDLE h3 = CreateThread(NULL, NULL,
		(LPTHREAD_START_ROUTINE)fc3,
		NULL, NULL, NULL);


	WaitForSingleObject(h1, INFINITE);
	WaitForSingleObject(h2, INFINITE);
	//WaitForSingleObject(h3, INFINITE);
#endif
	printf("n:%d\n", n);        //没有任何方案的话，n最终的值不可能是100000000；



	return 0;
}

